import asyncio

async def func1():
    print('我是func1')
    await asyncio.sleep(1)   # 发生阻塞的前面写 await
    print('func1结束')
    return 'func1的返回值'

async def func2():
    print('我是func2')
    await asyncio.sleep(2)
    print('func2结束')
    return 'func2的返回值'

async def func3():
    print('我是func3')
    print(1/0)
    await asyncio.sleep(3)
    print('func3结束')
    return 'func3的返回值'

async def main():
    f1 = func1()
    f2 = func2()
    f3 = func3()

    tasks = [
        asyncio.create_task(f2),
        asyncio.create_task(f1),
        asyncio.create_task(f3)
    ]

    #结束（done）、 运行（pending） pending是空的不会有值
    # done, pending = await asyncio.wait(tasks)  # asyncio.wait() 返回的结果是无序的，因为它是一个集合
    # for t in done:
    #     print(t.result())

    # 可用下面此种方案解决无序的问题
    # gather 和 wait 的区别：gather返回值是有顺序的（按照你添加任务的顺序返回的）
    # return_exceptions=True, 如果有错误信息，返回错误信息，其它任务正常执行
    # return_exceptions=False, 如果有错误信息，所有任务直接停止
    result = await asyncio.gather(*tasks,return_exceptions=True)     # 因为要传递的是位置参数，所以需要用 *tasks，而不是直接传tasks
    print(result)


if __name__ == '__main__':
    asyncio.run(main())

